package br.com.ozsolucoes.sessionbeans;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import br.com.ozsolucoes.entity.Categoria;
import br.com.ozsolucoes.entity.Servico;
import br.com.ozsolucoes.entity.Ticket;

@Stateless
public class TicketSessionBean {

	@PersistenceContext
	private EntityManager entityManager;

	public void abrirTicket(Ticket ticket) {
		Categoria categoria = new Categoria();
		Servico servico = new Servico();
		categoria = entityManager.find(Categoria.class, ticket.getCategoria().getId());
		servico = entityManager.find(Servico.class, ticket.getServico().getId());
		ticket.setServico(servico);
		ticket.setCategoria(categoria);
		ticket.setId(0);
		entityManager.persist(ticket);
	}

	public void alterarTicket(Ticket ticket) {
		entityManager.merge(ticket);
	}

	public void excluirTicket(Ticket ticket) {
		ticket = entityManager.find(Ticket.class, ticket.getId());
		entityManager.remove(ticket);
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTodosTickets() {
		Query query = entityManager.createNamedQuery("Ticket.consultarTodosTickets");
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTodosTickets(long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarTodosTicketsCliente");
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorTipoRequisicao(String tipoRequisicao) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorTipoRequisicao");
		query.setParameter("tipoRequisicao", tipoRequisicao);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorTipoRequisicaoCliente(String tipoRequisicao, long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorTipoRequisicaoCliente");
		query.setParameter("tipoRequisicao", tipoRequisicao);
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorTipoRequisicaoNivelUrgencia(String tipoRequisicao, String nivelUrgencia) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorTipoRequisicaoNivelUrgencia");
		query.setParameter("tipoRequisicao", tipoRequisicao);
		query.setParameter("nivelUrgencia", nivelUrgencia);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorTipoRequisicaoNivelUrgenciaCliente(String tipoRequisicao, String nivelUrgencia, long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorTipoRequisicaoNivelUrgenciaCliente");
		query.setParameter("tipoRequisicao", tipoRequisicao);
		query.setParameter("nivelUrgencia", nivelUrgencia);
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorTipoRequisicaoCategoria(String tipoRequisicao, String categoria) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorTipoRequisicaoCategoria");
		query.setParameter("tipoRequisicao", tipoRequisicao);
		query.setParameter("categoria", categoria);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorTipoRequisicaoCategoriaCliente(String tipoRequisicao, String categoria, long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorTipoRequisicaoCategoriaCliente");
		query.setParameter("tipoRequisicao", tipoRequisicao);
		query.setParameter("categoria", categoria);
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorNivelUrgencia(String nivelUrgencia) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorNivelUrgencia");
		query.setParameter("nivelUrgencia", nivelUrgencia);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorNivelUrgenciaCliente(String nivelUrgencia, long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorNivelUrgenciaCliente");
		query.setParameter("nivelUrgencia", nivelUrgencia);
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorNivelUrgenciaCategoria(String nivelUrgencia, String categoria) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorNivelUrgenciaCategoria");
		query.setParameter("nivelUrgencia", nivelUrgencia);
		query.setParameter("categoria", categoria);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorNivelUrgenciaCategoriaCliente(String nivelUrgencia, String categoria, long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorNivelUrgenciaCategoriaCliente");
		query.setParameter("nivelUrgencia", nivelUrgencia);
		query.setParameter("categoria", categoria);
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorCategoria(String categoria) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorCategoria");
		query.setParameter("categoria", categoria);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorCategoriaCliente(String categoria, long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorCategoriaCliente");
		query.setParameter("categoria", categoria);
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	public Ticket consultarPorNumeroTicket(String numeroTicket) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorNumeroTicket");
		query.setParameter("numeroTicket", numeroTicket);
		try {
			return (Ticket) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	public Ticket consultarPorId(long idTicket) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorId");
		query.setParameter("idTicket", idTicket);
		try {
			return (Ticket) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	/**
	 * TICKETS FECHADOS
	 */
	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTodosTicketsFechados() {
		Query query = entityManager.createNamedQuery("Ticket.consultarTodosTicketsFechados");
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTodosTicketsFechados(long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarTodosTicketsClienteFechados");
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorTipoRequisicaoFechados(String tipoRequisicao) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorTipoRequisicaoFechados");
		query.setParameter("tipoRequisicao", tipoRequisicao);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorTipoRequisicaoClienteFechados(String tipoRequisicao, long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorTipoRequisicaoClienteFechados");
		query.setParameter("tipoRequisicao", tipoRequisicao);
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorTipoRequisicaoNivelUrgenciaFechados(String tipoRequisicao, String nivelUrgencia) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorTipoRequisicaoNivelUrgenciaFechados");
		query.setParameter("tipoRequisicao", tipoRequisicao);
		query.setParameter("nivelUrgencia", nivelUrgencia);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorTipoRequisicaoNivelUrgenciaClienteFechados(String tipoRequisicao, String nivelUrgencia, long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorTipoRequisicaoNivelUrgenciaClienteFechados");
		query.setParameter("tipoRequisicao", tipoRequisicao);
		query.setParameter("nivelUrgencia", nivelUrgencia);
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorTipoRequisicaoCategoriaFechados(String tipoRequisicao, String categoria) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorTipoRequisicaoCategoriaFechados");
		query.setParameter("tipoRequisicao", tipoRequisicao);
		query.setParameter("categoria", categoria);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorTipoRequisicaoCategoriaClienteFechados(String tipoRequisicao, String categoria, long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorTipoRequisicaoCategoriaClienteFechados");
		query.setParameter("tipoRequisicao", tipoRequisicao);
		query.setParameter("categoria", categoria);
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorNivelUrgenciaFechados(String nivelUrgencia) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorNivelUrgenciaFechados");
		query.setParameter("nivelUrgencia", nivelUrgencia);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorNivelUrgenciaClienteFechados(String nivelUrgencia, long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorNivelUrgenciaClienteFechados");
		query.setParameter("nivelUrgencia", nivelUrgencia);
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorNivelUrgenciaCategoriaFechados(String nivelUrgencia, String categoria) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorNivelUrgenciaCategoriaFechados");
		query.setParameter("nivelUrgencia", nivelUrgencia);
		query.setParameter("categoria", categoria);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorNivelUrgenciaCategoriaClienteFechados(String nivelUrgencia, String categoria, long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorNivelUrgenciaCategoriaClienteFechados");
		query.setParameter("nivelUrgencia", nivelUrgencia);
		query.setParameter("categoria", categoria);
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorCategoriaFechados(String categoria) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorCategoriaFechados");
		query.setParameter("categoria", categoria);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketsPorCategoriaClienteFechados(String categoria, long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorCategoriaClienteFechados");
		query.setParameter("categoria", categoria);
		query.setParameter("idCliente", idCliente);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	public Ticket consultarPorNumeroTicketFechados(String numeroTicket) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorNumeroTicketFechados");
		query.setParameter("numeroTicket", numeroTicket);
		try {
			return (Ticket) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	public Ticket consultarPorIdFechados(long idTicket) {
		Query query = entityManager.createNamedQuery("Ticket.consultarPorIdFechados");
		query.setParameter("idTicket", idTicket);
		try {
			return (Ticket) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	public long contarTicketAbertosCliente(long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.contarTicketAbertosCliente");
		query.setParameter("idCliente", idCliente);
		try {
			return (Long) query.getSingleResult();
		} catch (NoResultException e) {
			return 0;
		}
	}

	public long contarTicketFechadosCliente(long idCliente) {
		Query query = entityManager.createNamedQuery("Ticket.contarTicketFechadosCliente");
		query.setParameter("idCliente", idCliente);
		try {
			return (Long) query.getSingleResult();
		} catch (NoResultException e) {
			return 0;
		}
	}

	public long contarTicketAbertosClientePorServico(long idCliente, long idServico) {
		Query query = entityManager.createNamedQuery("Ticket.contarTicketAbertosClientePorServico");
		query.setParameter("idCliente", idCliente);
		query.setParameter("idServico", idServico);
		try {
			return (Long) query.getSingleResult();
		} catch (NoResultException e) {
			return 0;
		}
	}

	public long contarTicketFechadosClientePorServico(long idCliente, long idServico) {
		Query query = entityManager.createNamedQuery("Ticket.contarTicketFechadosClientePorServico");
		query.setParameter("idCliente", idCliente);
		query.setParameter("idServico", idServico);
		try {
			return (Long) query.getSingleResult();
		} catch (NoResultException e) {
			return 0;
		}
	}

	public long contarTicketFechadosClientePorCategoria(long idCliente, String categoria) {
		Query query = entityManager.createNamedQuery("Ticket.contarTicketFechadosClientePorCategoria");
		query.setParameter("idCliente", idCliente);
		query.setParameter("categoria", categoria);
		try {
			return (Long) query.getSingleResult();
		} catch (NoResultException e) {
			return 0;
		}
	}

	public long contarTicketAbertosClientePorCategoria(long idCliente, String categoria) {
		Query query = entityManager.createNamedQuery("Ticket.contarTicketAbertosClientePorCategoria");
		query.setParameter("idCliente", idCliente);
		query.setParameter("categoria", categoria);
		try {
			return (Long) query.getSingleResult();
		} catch (NoResultException e) {
			return 0;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketClientePorCategoria(long idCliente, String categoria) {
		Query query = entityManager.createNamedQuery("Ticket.contarTicketClientePorCategoria");
		query.setParameter("idCliente", idCliente);
		query.setParameter("categoria", categoria);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Ticket> consultarTicketDoServico(long idServico) {
		Query query = entityManager.createNamedQuery("Ticket.consultarTicketDoServico");
		query.setParameter("idServico", idServico);
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}

}
